package main

import (
	"os/exec"
	"syscall"
	"os"
	"log"
)

// mount namespace
/*
	mount namespace 是用来隔离各个进程看到的挂载点视图，在不同的namespace中，看到的文件系统是不一样的。
	在Mount Namespace中调用mount()和unmount()仅仅会影响当前namespace内的文件系统，而对全局是没有影响的。
 */

func main(){

	// := 直接赋值，不用声明变量，go可以进行类型推断
	cmd := exec.Command("sh")

	// &符号的作用是取变量的地址 *是取变量的值
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Cloneflags:syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS,
	}

	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		log.Fatal(err)
	}

}
